Skip to content

[dotnet] Safe modifications of internal log handlers#17334

Merged
nvborisenko merged 3 commits into
SeleniumHQ:trunkfrom
nvborisenko:dotnet-loghandlers-iterator
Apr 10, 2026
Merged

[dotnet] Safe modifications of internal log handlers#17334
nvborisenko merged 3 commits into
SeleniumHQ:trunkfrom
nvborisenko:dotnet-loghandlers-iterator

Conversation

@nvborisenko
Copy link
Copy Markdown
Member

Make is safe to modify log handlers while iterating.

💥 What does this PR do?

This pull request refactors the LogHandlerList class to improve its internal implementation and thread safety. The class no longer inherits from List<ILogHandler>, and now manages its own internal array of handlers. This change also updates how handlers are added, removed, and enumerated, ensuring a more robust and maintainable design.

LogHandlerList refactoring and improvements:

  • Changed LogHandlerList to no longer inherit from List<ILogHandler>, instead implementing its own internal storage with a volatile array for thread safety.
  • Updated Add, Remove, and Clear methods to operate on the internal _handlers array, removing use of base class methods and ensuring modifications are thread-safe.
  • Implemented IEnumerable<ILogHandler> explicitly to allow enumeration over the internal array of handlers.
  • Added using System.Collections; to support the new enumeration implementation.

Minor code style improvement:

  • Added a blank line in LogContext.cs for improved readability.

🔧 Implementation Notes

Copy-on-write approach to achieve immutability internally.

🔄 Types of changes

  • Bug fix (backwards compatible)

Copilot AI review requested due to automatic review settings April 10, 2026 09:51
@qodo-code-review
Copy link
Copy Markdown
Contributor

Review Summary by Qodo

Refactor LogHandlerList with copy-on-write for thread safety

🐞 Bug fix

Grey Divider

Walkthroughs

Description
• Refactored LogHandlerList to use copy-on-write pattern for thread safety
• Removed inheritance from List<ILogHandler> for safer handler modifications
• Implemented explicit IEnumerable<ILogHandler> to support safe iteration
• Added blank line in LogContext.cs for improved readability

Grey Divider

File Changes

1. dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs 🐞 Bug fix +16/-8

Implement copy-on-write pattern for thread-safe handler management

• Changed class to no longer inherit from List<ILogHandler>, now manages internal _handlers
 array
• Implemented copy-on-write pattern in Add, Remove, and Clear methods for thread safety
• Added explicit IEnumerable<ILogHandler> implementation with GetEnumerator methods
• Added using System.Collections; namespace import

dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs


2. dotnet/src/webdriver/Internal/Logging/LogContext.cs Formatting +1/-0

Add blank line for readability

• Added blank line after validation check for improved code readability

dotnet/src/webdriver/Internal/Logging/LogContext.cs


Grey Divider

Qodo Logo

@selenium-ci selenium-ci added the C-dotnet .NET Bindings label Apr 10, 2026
@qodo-code-review
Copy link
Copy Markdown
Contributor

qodo-code-review Bot commented Apr 10, 2026

Code Review by Qodo

🐞 Bugs (1)   📘 Rule violations (2)   📎 Requirement gaps (0)   🎨 UX Issues (0)
🐞\ ➹ Performance (1)
📘\ ≡ Correctness (1) ⚙ Maintainability (1)

Grey Divider


Action required

1. _handlers loses concurrent updates📘
Description
Add, Remove, and Clear update the shared _handlers array via unsynchronized
read-modify-write assignments, so concurrent calls can overwrite each other and silently drop
handlers. This violates the requirement to make concurrent code race-safe with correct
synchronization/atomicity.
Code

dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[R31-62]

+    private volatile ILogHandler[] _handlers;

    public LogHandlerList(ILogContext logContext)
    {
        _logContext = logContext;
+        _handlers = [];
    }

    public LogHandlerList(ILogContext logContext, IEnumerable<ILogHandler> handlers)
-        : base(handlers)
    {
        _logContext = logContext;
+        _handlers = [.. handlers];
    }

-    public new ILogContext Add(ILogHandler handler)
+    public ILogContext Add(ILogHandler handler)
    {
-        base.Add(handler);
+        _handlers = [.. _handlers, handler];

        return _logContext;
    }

-    public new ILogContext Remove(ILogHandler handler)
+    public ILogContext Remove(ILogHandler handler)
    {
-        base.Remove(handler);
+        _handlers = [.. _handlers.Where(h => h != handler)];

        return _logContext;
    }

-    public new ILogContext Clear()
+    public ILogContext Clear()
    {
-        base.Clear();
+        _handlers = [];
Evidence
PR Compliance ID 10 requires race-safe shared state updates; volatile only provides visibility,
but the updates here are not atomic. The code assigns _handlers = [.. _handlers, handler] /
_handlers = [.. _handlers.Where(...)] / _handlers = [] without a lock or CAS loop, so two
threads can compute different new arrays from the same old snapshot and the last write wins, losing
the other update.

dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[31-62]
Best Practice: Learned patterns

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`LogHandlerList` uses a copy-on-write array but updates it with non-atomic read-modify-write assignments, which can lose updates under concurrent `Add`/`Remove`/`Clear`.

## Issue Context
`volatile` guarantees visibility of the array reference but does not make composite updates atomic; concurrent writers can overwrite each other.

## Fix Focus Areas
- dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[31-62]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. Remove() deletes all duplicates 📘
Description
Remove(ILogHandler handler) now filters out every matching handler instance, changing behavior
from the typical single-removal semantics and potentially breaking callers that add the same handler
more than once. This is a user-visible behavior change on a public interface method without an
established compatibility mechanism.
Code

dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[R52-55]

+    public ILogContext Remove(ILogHandler handler)
    {
-        base.Remove(handler);
+        _handlers = [.. _handlers.Where(h => h != handler)];
Evidence
PR Compliance ID 1 requires preserving backward-compatible behavior for public interfaces. The new
implementation uses _handlers.Where(h => h != handler) which removes all occurrences of handler,
rather than removing a single occurrence, which is a potentially breaking behavior change for
ILogHandlerList.Remove.

AGENTS.md
dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[52-55]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`ILogHandlerList.Remove` currently removes all duplicate instances of the same handler in one call, which may break callers relying on single-removal behavior.

## Issue Context
The method is part of a public interface (`ILogHandlerList`), so observable semantics changes should be minimized or explicitly documented and tested.

## Fix Focus Areas
- dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[52-55]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. No tests for safe iteration 📘
Description
This PR changes observable handler iteration/modification behavior (copy-on-write enumeration) but
does not add/update unit tests to lock in the new guarantees (e.g., modifying handlers during
emission/iteration). Lack of tests risks regressions and violates the requirement to adjust unit
tests for observable behavior changes.
Code

dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[R45-68]

+    public ILogContext Add(ILogHandler handler)
    {
-        base.Add(handler);
+        _handlers = [.. _handlers, handler];

        return _logContext;
    }

-    public new ILogContext Remove(ILogHandler handler)
+    public ILogContext Remove(ILogHandler handler)
    {
-        base.Remove(handler);
+        _handlers = [.. _handlers.Where(h => h != handler)];

        return _logContext;
    }

-    public new ILogContext Clear()
+    public ILogContext Clear()
    {
-        base.Clear();
+        _handlers = [];

        return _logContext;
    }
+
+    public IEnumerator<ILogHandler> GetEnumerator() => ((IEnumerable<ILogHandler>)_handlers).GetEnumerator();
+
+    IEnumerator IEnumerable.GetEnumerator() => _handlers.GetEnumerator();
Evidence
PR Compliance ID 11 requires adding/adjusting unit tests when observable behavior changes. The PR
modifies how handlers are stored and enumerated (new array-backed enumerators and copy-on-write
mutations), but existing logging tests do not cover modifying handlers during enumeration/emission,
leaving the new behavior unverified.

dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[45-68]
dotnet/test/webdriver/Internal/Logging/LogTests.cs[24-301]
Best Practice: Learned patterns

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Observable behavior around handler storage/enumeration was changed, but there are no unit tests asserting the new guarantees (e.g., that iterating handlers while adding/removing does not throw and behaves as intended).

## Issue Context
The logging subsystem is user-facing via `Log.Handlers` and is prone to subtle regressions without targeted unit tests.

## Fix Focus Areas
- dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[45-68]
- dotnet/test/webdriver/Internal/Logging/LogTests.cs[24-301]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Advisory comments

4. Per-call array allocation 🐞
Description
Add and Remove allocate a new array on every call (and Remove also uses LINQ), which is a
performance regression compared to List<T>’s amortized Add and in-place Remove. If handlers
are configured frequently (e.g., per-test or per-scope), this will add avoidable allocations/GC
pressure.
Code

dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[R45-55]

+    public ILogContext Add(ILogHandler handler)
    {
-        base.Add(handler);
+        _handlers = [.. _handlers, handler];

        return _logContext;
    }

-    public new ILogContext Remove(ILogHandler handler)
+    public ILogContext Remove(ILogHandler handler)
    {
-        base.Remove(handler);
+        _handlers = [.. _handlers.Where(h => h != handler)];
Evidence
The implementation rebuilds the entire _handlers array for both Add ([.. _handlers, handler])
and Remove ([.. _handlers.Where(...)]), which necessarily allocates a new array each time; Remove
also constructs LINQ iterators during filtering.

dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[45-55]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`Add`/`Remove` rebuild arrays via collection expressions and LINQ. This is allocation-heavy compared to list-based approaches.

### Issue Context
Copy-on-write is fine, but you can still implement it with fewer allocations and without LINQ iterator overhead.

### Fix Focus Areas
- dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs[45-57]

### Implementation direction
- Replace LINQ `Where` with a manual loop to count/remove and allocate exactly once.
- Consider using `ImmutableArray<ILogHandler>` or `List<ILogHandler>` internally with a lock, depending on desired tradeoffs.
- If keeping arrays, use `Array.Copy` for Add and a single-pass removal builder for Remove.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors the .NET internal logging handler collection to avoid InvalidOperationException-style issues when handlers are modified during enumeration (copy-on-write snapshotting), and includes a minor formatting tweak.

Changes:

  • Refactor LogHandlerList to stop inheriting from List<ILogHandler> and use an internal handler array with custom add/remove/clear + enumeration.
  • Update enumeration to iterate over a stable snapshot of handlers.
  • Minor whitespace-only change in LogContext.cs.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs Replaces List<T> inheritance with snapshot-array storage and custom mutation/enumeration methods.
dotnet/src/webdriver/Internal/Logging/LogContext.cs Adds a blank line in the constructor for readability (but currently includes trailing whitespace).

Comment thread dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs
Comment thread dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs
Comment thread dotnet/src/webdriver/Internal/Logging/LogContext.cs Outdated
Comment thread dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs
@nvborisenko nvborisenko merged commit 0f5491d into SeleniumHQ:trunk Apr 10, 2026
19 checks passed
@nvborisenko nvborisenko deleted the dotnet-loghandlers-iterator branch April 10, 2026 17:45
This was referenced May 13, 2026
PhilipWoulfe pushed a commit to PhilipWoulfe/F1Competition that referenced this pull request May 19, 2026
Updated
[Microsoft.AspNetCore.Components.Authorization](https://github.com/dotnet/aspnetcore)
from 8.0.26 to 8.0.27.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.AspNetCore.Components.Authorization's
releases](https://github.com/dotnet/aspnetcore/releases)._

## 8.0.27

[Release](https://github.com/dotnet/core/releases/tag/v8.0.27)

## What's Changed
* [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in
dotnet/aspnetcore#66205
* [release/8.0] Update NPM dependencies by @​wtgodbe in
dotnet/aspnetcore#66052
* [release/8.0] Move off of dead-lettered Windows preview helix queue by
@​wtgodbe in dotnet/aspnetcore#66220
* [release/8.0] (deps): Bump src/submodules/googletest from `73a63ea` to
`d72f9c8` by @​dependabot[bot] in
dotnet/aspnetcore#66087
* [release/8.0] Replace dn-bot-dnceng-build-rw-code-rw PAT with WIF
service connection in mirror-within-azdo by @​missymessa in
dotnet/aspnetcore#66115
* [release/8.0] Update dependencies from dotnet/source-build-externals
by @​dotnet-maestro[bot] in
dotnet/aspnetcore#66216
* [release/8.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/aspnetcore#66081
* [release/8.0] Update dependencies from
dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in
dotnet/aspnetcore#66131
* [release/8.0] Update @​azure/msal-browser from 2.x to 4.x by @​wtgodbe
in dotnet/aspnetcore#66236
* [release/8.0] Use source-build-assets repo by @​NikolaMilosavljevic in
dotnet/aspnetcore#66276
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/aspnetcore#66317


**Full Changelog**:
dotnet/aspnetcore@v8.0.26...v8.0.27

Commits viewable in [compare
view](dotnet/aspnetcore@v8.0.26...v8.0.27).
</details>

Updated
[Microsoft.AspNetCore.Components.WebAssembly](https://github.com/dotnet/aspnetcore)
from 8.0.26 to 8.0.27.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.AspNetCore.Components.WebAssembly's
releases](https://github.com/dotnet/aspnetcore/releases)._

## 8.0.27

[Release](https://github.com/dotnet/core/releases/tag/v8.0.27)

## What's Changed
* [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in
dotnet/aspnetcore#66205
* [release/8.0] Update NPM dependencies by @​wtgodbe in
dotnet/aspnetcore#66052
* [release/8.0] Move off of dead-lettered Windows preview helix queue by
@​wtgodbe in dotnet/aspnetcore#66220
* [release/8.0] (deps): Bump src/submodules/googletest from `73a63ea` to
`d72f9c8` by @​dependabot[bot] in
dotnet/aspnetcore#66087
* [release/8.0] Replace dn-bot-dnceng-build-rw-code-rw PAT with WIF
service connection in mirror-within-azdo by @​missymessa in
dotnet/aspnetcore#66115
* [release/8.0] Update dependencies from dotnet/source-build-externals
by @​dotnet-maestro[bot] in
dotnet/aspnetcore#66216
* [release/8.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/aspnetcore#66081
* [release/8.0] Update dependencies from
dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in
dotnet/aspnetcore#66131
* [release/8.0] Update @​azure/msal-browser from 2.x to 4.x by @​wtgodbe
in dotnet/aspnetcore#66236
* [release/8.0] Use source-build-assets repo by @​NikolaMilosavljevic in
dotnet/aspnetcore#66276
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/aspnetcore#66317


**Full Changelog**:
dotnet/aspnetcore@v8.0.26...v8.0.27

Commits viewable in [compare
view](dotnet/aspnetcore@v8.0.26...v8.0.27).
</details>

Updated
[Microsoft.AspNetCore.Components.WebAssembly.DevServer](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.AspNetCore.Components.WebAssembly.DevServer's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated
[Microsoft.AspNetCore.Http.Abstractions](https://github.com/dotnet/aspnetcore)
from 2.3.9 to 2.3.10.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.AspNetCore.Http.Abstractions's
releases](https://github.com/dotnet/aspnetcore/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/aspnetcore/commits).
</details>

Updated
[Microsoft.AspNetCore.Mvc.Testing](https://github.com/dotnet/aspnetcore)
from 8.0.26 to 8.0.27.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.AspNetCore.Mvc.Testing's
releases](https://github.com/dotnet/aspnetcore/releases)._

## 8.0.27

[Release](https://github.com/dotnet/core/releases/tag/v8.0.27)

## What's Changed
* [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in
dotnet/aspnetcore#66205
* [release/8.0] Update NPM dependencies by @​wtgodbe in
dotnet/aspnetcore#66052
* [release/8.0] Move off of dead-lettered Windows preview helix queue by
@​wtgodbe in dotnet/aspnetcore#66220
* [release/8.0] (deps): Bump src/submodules/googletest from `73a63ea` to
`d72f9c8` by @​dependabot[bot] in
dotnet/aspnetcore#66087
* [release/8.0] Replace dn-bot-dnceng-build-rw-code-rw PAT with WIF
service connection in mirror-within-azdo by @​missymessa in
dotnet/aspnetcore#66115
* [release/8.0] Update dependencies from dotnet/source-build-externals
by @​dotnet-maestro[bot] in
dotnet/aspnetcore#66216
* [release/8.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/aspnetcore#66081
* [release/8.0] Update dependencies from
dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in
dotnet/aspnetcore#66131
* [release/8.0] Update @​azure/msal-browser from 2.x to 4.x by @​wtgodbe
in dotnet/aspnetcore#66236
* [release/8.0] Use source-build-assets repo by @​NikolaMilosavljevic in
dotnet/aspnetcore#66276
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/aspnetcore#66317


**Full Changelog**:
dotnet/aspnetcore@v8.0.26...v8.0.27

Commits viewable in [compare
view](dotnet/aspnetcore@v8.0.26...v8.0.27).
</details>

Updated
[Microsoft.AspNetCore.OpenApi](https://github.com/dotnet/aspnetcore)
from 8.0.26 to 8.0.27.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.AspNetCore.OpenApi's
releases](https://github.com/dotnet/aspnetcore/releases)._

## 8.0.27

[Release](https://github.com/dotnet/core/releases/tag/v8.0.27)

## What's Changed
* [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in
dotnet/aspnetcore#66205
* [release/8.0] Update NPM dependencies by @​wtgodbe in
dotnet/aspnetcore#66052
* [release/8.0] Move off of dead-lettered Windows preview helix queue by
@​wtgodbe in dotnet/aspnetcore#66220
* [release/8.0] (deps): Bump src/submodules/googletest from `73a63ea` to
`d72f9c8` by @​dependabot[bot] in
dotnet/aspnetcore#66087
* [release/8.0] Replace dn-bot-dnceng-build-rw-code-rw PAT with WIF
service connection in mirror-within-azdo by @​missymessa in
dotnet/aspnetcore#66115
* [release/8.0] Update dependencies from dotnet/source-build-externals
by @​dotnet-maestro[bot] in
dotnet/aspnetcore#66216
* [release/8.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/aspnetcore#66081
* [release/8.0] Update dependencies from
dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in
dotnet/aspnetcore#66131
* [release/8.0] Update @​azure/msal-browser from 2.x to 4.x by @​wtgodbe
in dotnet/aspnetcore#66236
* [release/8.0] Use source-build-assets repo by @​NikolaMilosavljevic in
dotnet/aspnetcore#66276
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/aspnetcore#66317


**Full Changelog**:
dotnet/aspnetcore@v8.0.26...v8.0.27

Commits viewable in [compare
view](dotnet/aspnetcore@v8.0.26...v8.0.27).
</details>

Updated
[Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore) from
9.0.15 to 9.0.16.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.EntityFrameworkCore's
releases](https://github.com/dotnet/efcore/releases)._

## 9.0.16

[Release](https://github.com/dotnet/core/releases/tag/v9.0.16)

## What's Changed
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/efcore#37900
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#37969
* [release/8.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38034
* [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in
dotnet/efcore#38062
* [release/9.0] Update branding to 9.0.16 by @​vseanreesermsft in
dotnet/efcore#38063
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38053
* [automated] Merge branch 'release/8.0' => 'release/9.0' by
@​github-actions[bot] in dotnet/efcore#37908
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/efcore#38099
* [automated] Merge branch 'release/8.0' => 'release/9.0' by
@​github-actions[bot] in dotnet/efcore#38101
* Merging internal commits for release/9.0 by @​vseanreesermsft in
dotnet/efcore#38098
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38170


**Full Changelog**:
dotnet/efcore@v9.0.15...v9.0.16

Commits viewable in [compare
view](dotnet/efcore@v9.0.15...v9.0.16).
</details>

Updated
[Microsoft.EntityFrameworkCore.Design](https://github.com/dotnet/efcore)
from 9.0.15 to 9.0.16.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.EntityFrameworkCore.Design's
releases](https://github.com/dotnet/efcore/releases)._

## 9.0.16

[Release](https://github.com/dotnet/core/releases/tag/v9.0.16)

## What's Changed
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/efcore#37900
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#37969
* [release/8.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38034
* [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in
dotnet/efcore#38062
* [release/9.0] Update branding to 9.0.16 by @​vseanreesermsft in
dotnet/efcore#38063
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38053
* [automated] Merge branch 'release/8.0' => 'release/9.0' by
@​github-actions[bot] in dotnet/efcore#37908
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/efcore#38099
* [automated] Merge branch 'release/8.0' => 'release/9.0' by
@​github-actions[bot] in dotnet/efcore#38101
* Merging internal commits for release/9.0 by @​vseanreesermsft in
dotnet/efcore#38098
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38170


**Full Changelog**:
dotnet/efcore@v9.0.15...v9.0.16

Commits viewable in [compare
view](dotnet/efcore@v9.0.15...v9.0.16).
</details>

Updated
[Microsoft.EntityFrameworkCore.InMemory](https://github.com/dotnet/efcore)
from 9.0.15 to 9.0.16.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.EntityFrameworkCore.InMemory's
releases](https://github.com/dotnet/efcore/releases)._

## 9.0.16

[Release](https://github.com/dotnet/core/releases/tag/v9.0.16)

## What's Changed
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/efcore#37900
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#37969
* [release/8.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38034
* [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in
dotnet/efcore#38062
* [release/9.0] Update branding to 9.0.16 by @​vseanreesermsft in
dotnet/efcore#38063
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38053
* [automated] Merge branch 'release/8.0' => 'release/9.0' by
@​github-actions[bot] in dotnet/efcore#37908
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/efcore#38099
* [automated] Merge branch 'release/8.0' => 'release/9.0' by
@​github-actions[bot] in dotnet/efcore#38101
* Merging internal commits for release/9.0 by @​vseanreesermsft in
dotnet/efcore#38098
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38170


**Full Changelog**:
dotnet/efcore@v9.0.15...v9.0.16

Commits viewable in [compare
view](dotnet/efcore@v9.0.15...v9.0.16).
</details>

Updated
[Microsoft.EntityFrameworkCore.Relational](https://github.com/dotnet/efcore)
from 9.0.15 to 9.0.16.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.EntityFrameworkCore.Relational's
releases](https://github.com/dotnet/efcore/releases)._

## 9.0.16

[Release](https://github.com/dotnet/core/releases/tag/v9.0.16)

## What's Changed
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/efcore#37900
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#37969
* [release/8.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38034
* [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in
dotnet/efcore#38062
* [release/9.0] Update branding to 9.0.16 by @​vseanreesermsft in
dotnet/efcore#38063
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38053
* [automated] Merge branch 'release/8.0' => 'release/9.0' by
@​github-actions[bot] in dotnet/efcore#37908
* Merging internal commits for release/8.0 by @​vseanreesermsft in
dotnet/efcore#38099
* [automated] Merge branch 'release/8.0' => 'release/9.0' by
@​github-actions[bot] in dotnet/efcore#38101
* Merging internal commits for release/9.0 by @​vseanreesermsft in
dotnet/efcore#38098
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/efcore#38170


**Full Changelog**:
dotnet/efcore@v9.0.15...v9.0.16

Commits viewable in [compare
view](dotnet/efcore@v9.0.15...v9.0.16).
</details>

Updated
[Microsoft.Extensions.Caching.Abstractions](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Caching.Abstractions's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated
[Microsoft.Extensions.Configuration](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Configuration's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated
[Microsoft.Extensions.Configuration.Binder](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Configuration.Binder's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated [Microsoft.Extensions.Hosting](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Hosting's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated [Microsoft.Extensions.Http](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Http's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated
[Microsoft.Extensions.Options.DataAnnotations](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Options.DataAnnotations's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated [Selenium.Support](https://github.com/SeleniumHQ/selenium) from
4.43.0 to 4.44.0.

<details>
<summary>Release notes</summary>

_Sourced from [Selenium.Support's
releases](https://github.com/SeleniumHQ/selenium/releases)._

## 4.44.0

## Detailed Changelogs by Component

<img src="https://www.selenium.dev/images/programming/java.svg"
width="20" height="20">
**[Java](https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/python.svg" width="20"
height="20">
**[Python](https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/dotnet.svg" width="20"
height="20">
**[DotNet](https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/CHANGELOG)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/ruby.svg" width="20"
height="20">
**[Ruby](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/javascript.svg"
width="20" height="20">
**[JavaScript](https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/selenium-webdriver/CHANGES.md)**
<br>


<!-- Release notes generated using configuration in .github/release.yml
at da2039bd1456a161d0c284de16f9f4f179f1e8ca -->

## What's Changed
<details>
<summary>Click to see all the changes included in this release</summary>

* fix(documentation): update artifact naming for generated docs by
@​diemol in SeleniumHQ/selenium#17332
* fix(ruby): retrieve devtools version dynamically for package
verification by @​diemol in
SeleniumHQ/selenium#17335
* [dotnet] Don't truncate internal log messages at error/warn levels by
@​nvborisenko in SeleniumHQ/selenium#17333
* [dotnet] Safe modifications of internal log handlers by @​nvborisenko
in SeleniumHQ/selenium#17334
* [dotnet] Remove planned obsoleted members for 4.44 by @​nvborisenko in
SeleniumHQ/selenium#17328
* [dotnet] [bidi] Statically declare commands by @​nvborisenko in
SeleniumHQ/selenium#17330
* [dotnet] [bidi] Statically declared events by @​nvborisenko in
SeleniumHQ/selenium#17331
* [dotnet] Add C# 14 extension to polyfill
`ArgumentNullException.ThrowIfNull` by @​RenderMichael in
SeleniumHQ/selenium#16697
* [dotnet] [bidi] Align SetDownloadBehavior command by @​nvborisenko in
SeleniumHQ/selenium#17336
* [dotnet] [bidi] Align ContinueWithAuth command by @​nvborisenko in
SeleniumHQ/selenium#17337
* [dotnet] [bidi] Align SetGeolocation polymorphic command by
@​nvborisenko in SeleniumHQ/selenium#17338
* [dotnet] [test] In-process test webserver by @​nvborisenko in
SeleniumHQ/selenium#17339
* [java] deprecate the 'native' methods inside the HttpClient interface
by @​joerg1985 in SeleniumHQ/selenium#17340
* CDDL 2 Python generator by @​AutomatedTester in
SeleniumHQ/selenium#16914
* Fix py:local_dev rake task by @​cgoldberg in
SeleniumHQ/selenium#17342
* [grid] Accept legacy session-closed event payloads by @​VietND96 in
SeleniumHQ/selenium#17343
* [java] specify nullability in package `org.openqa.selenium.remote` by
@​asolntsev in SeleniumHQ/selenium#17325
* fix NPE when response status is null by @​asolntsev in
SeleniumHQ/selenium#17348
* [java] fix NoSuchElementException for custom By locators by
@​Chandan25sharma in SeleniumHQ/selenium#17287
* [py] Update docs with pytest example and minor formatting fixes by
@​cgoldberg in SeleniumHQ/selenium#17351
* [dotnet] Fix stopping of network monitoring via DevTools by
@​nvborisenko in SeleniumHQ/selenium#17352
* [dotnet] [test] Update tests to target .NET 10 by @​nvborisenko in
SeleniumHQ/selenium#17353
* [build] Clean extra tools from GHA runner to free disk space by
@​cgoldberg in SeleniumHQ/selenium#17360
* Initial Creation of the Selenium CLI Tool by @​AutomatedTester in
SeleniumHQ/selenium#17327
* [java] fix some nullability warnings by @​asolntsev in
SeleniumHQ/selenium#17362
* [py] Use generated Bidi files instead of hand curated ones by
@​AutomatedTester in SeleniumHQ/selenium#17266
* [docs] Add AI-assisted contribution policy by @​titusfortner in
SeleniumHQ/selenium#17043
* [Agents] Update agents to make sure do linting. by @​AutomatedTester
in SeleniumHQ/selenium#17366
* [py] Bump dependencies by @​cgoldberg in
SeleniumHQ/selenium#17368
* [git] update gitignore to exclude mempalace by @​AutomatedTester in
SeleniumHQ/selenium#17369
* [java] remove field `ChromiumDriver.capabilities` by @​asolntsev in
SeleniumHQ/selenium#17363
* [spec] Use http_file for the cddl files by @​AutomatedTester in
SeleniumHQ/selenium#17372
* [dotnet] [bidi] Obsolete Type(string) method in Input module by
@​nvborisenko in SeleniumHQ/selenium#17377
* Fix Network failures by @​AutomatedTester in
SeleniumHQ/selenium#17381
* [java] [test] Unignore bidi network conditions tests for Firefox by
@​nvborisenko in SeleniumHQ/selenium#17385
* [dotnet] [test] Unignore network conditions tests for Firefox by
@​nvborisenko in SeleniumHQ/selenium#17386
* [dotnet] [test] Migrate to MTP by @​nvborisenko in
SeleniumHQ/selenium#17384
* [dotnet] Support `UnhandledPromptBehavior` option as string and map
(breaking change) by @​nvborisenko in
SeleniumHQ/selenium#16557
 ... (truncated)

Commits viewable in [compare
view](SeleniumHQ/selenium@selenium-4.43.0...selenium-4.44.0).
</details>

Updated [Selenium.WebDriver](https://github.com/SeleniumHQ/selenium)
from 4.43.0 to 4.44.0.

<details>
<summary>Release notes</summary>

_Sourced from [Selenium.WebDriver's
releases](https://github.com/SeleniumHQ/selenium/releases)._

## 4.44.0

## Detailed Changelogs by Component

<img src="https://www.selenium.dev/images/programming/java.svg"
width="20" height="20">
**[Java](https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/python.svg" width="20"
height="20">
**[Python](https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/dotnet.svg" width="20"
height="20">
**[DotNet](https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/CHANGELOG)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/ruby.svg" width="20"
height="20">
**[Ruby](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/javascript.svg"
width="20" height="20">
**[JavaScript](https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/selenium-webdriver/CHANGES.md)**
<br>


<!-- Release notes generated using configuration in .github/release.yml
at da2039bd1456a161d0c284de16f9f4f179f1e8ca -->

## What's Changed
<details>
<summary>Click to see all the changes included in this release</summary>

* fix(documentation): update artifact naming for generated docs by
@​diemol in SeleniumHQ/selenium#17332
* fix(ruby): retrieve devtools version dynamically for package
verification by @​diemol in
SeleniumHQ/selenium#17335
* [dotnet] Don't truncate internal log messages at error/warn levels by
@​nvborisenko in SeleniumHQ/selenium#17333
* [dotnet] Safe modifications of internal log handlers by @​nvborisenko
in SeleniumHQ/selenium#17334
* [dotnet] Remove planned obsoleted members for 4.44 by @​nvborisenko in
SeleniumHQ/selenium#17328
* [dotnet] [bidi] Statically declare commands by @​nvborisenko in
SeleniumHQ/selenium#17330
* [dotnet] [bidi] Statically declared events by @​nvborisenko in
SeleniumHQ/selenium#17331
* [dotnet] Add C# 14 extension to polyfill
`ArgumentNullException.ThrowIfNull` by @​RenderMichael in
SeleniumHQ/selenium#16697
* [dotnet] [bidi] Align SetDownloadBehavior command by @​nvborisenko in
SeleniumHQ/selenium#17336
* [dotnet] [bidi] Align ContinueWithAuth command by @​nvborisenko in
SeleniumHQ/selenium#17337
* [dotnet] [bidi] Align SetGeolocation polymorphic command by
@​nvborisenko in SeleniumHQ/selenium#17338
* [dotnet] [test] In-process test webserver by @​nvborisenko in
SeleniumHQ/selenium#17339
* [java] deprecate the 'native' methods inside the HttpClient interface
by @​joerg1985 in SeleniumHQ/selenium#17340
* CDDL 2 Python generator by @​AutomatedTester in
SeleniumHQ/selenium#16914
* Fix py:local_dev rake task by @​cgoldberg in
SeleniumHQ/selenium#17342
* [grid] Accept legacy session-closed event payloads by @​VietND96 in
SeleniumHQ/selenium#17343
* [java] specify nullability in package `org.openqa.selenium.remote` by
@​asolntsev in SeleniumHQ/selenium#17325
* fix NPE when response status is null by @​asolntsev in
SeleniumHQ/selenium#17348
* [java] fix NoSuchElementException for custom By locators by
@​Chandan25sharma in SeleniumHQ/selenium#17287
* [py] Update docs with pytest example and minor formatting fixes by
@​cgoldberg in SeleniumHQ/selenium#17351
* [dotnet] Fix stopping of network monitoring via DevTools by
@​nvborisenko in SeleniumHQ/selenium#17352
* [dotnet] [test] Update tests to target .NET 10 by @​nvborisenko in
SeleniumHQ/selenium#17353
* [build] Clean extra tools from GHA runner to free disk space by
@​cgoldberg in SeleniumHQ/selenium#17360
* Initial Creation of the Selenium CLI Tool by @​AutomatedTester in
SeleniumHQ/selenium#17327
* [java] fix some nullability warnings by @​asolntsev in
SeleniumHQ/selenium#17362
* [py] Use generated Bidi files instead of hand curated ones by
@​AutomatedTester in SeleniumHQ/selenium#17266
* [docs] Add AI-assisted contribution policy by @​titusfortner in
SeleniumHQ/selenium#17043
* [Agents] Update agents to make sure do linting. by @​AutomatedTester
in SeleniumHQ/selenium#17366
* [py] Bump dependencies by @​cgoldberg in
SeleniumHQ/selenium#17368
* [git] update gitignore to exclude mempalace by @​AutomatedTester in
SeleniumHQ/selenium#17369
* [java] remove field `ChromiumDriver.capabilities` by @​asolntsev in
SeleniumHQ/selenium#17363
* [spec] Use http_file for the cddl files by @​AutomatedTester in
SeleniumHQ/selenium#17372
* [dotnet] [bidi] Obsolete Type(string) method in Input module by
@​nvborisenko in SeleniumHQ/selenium#17377
* Fix Network failures by @​AutomatedTester in
SeleniumHQ/selenium#17381
* [java] [test] Unignore bidi network conditions tests for Firefox by
@​nvborisenko in SeleniumHQ/selenium#17385
* [dotnet] [test] Unignore network conditions tests for Firefox by
@​nvborisenko in SeleniumHQ/selenium#17386
* [dotnet] [test] Migrate to MTP by @​nvborisenko in
SeleniumHQ/selenium#17384
* [dotnet] Support `UnhandledPromptBehavior` option as string and map
(breaking change) by @​nvborisenko in
SeleniumHQ/selenium#16557
 ... (truncated)

Commits viewable in [compare
view](SeleniumHQ/selenium@selenium-4.43.0...selenium-4.44.0).
</details>

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

C-dotnet .NET Bindings

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants